/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import bean.Autor;
import bean.Instituicao;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author fernando
 */
public class AutorDao implements Serializable {
    private Conexao conexao;
    private PreparedStatement ps;
    private boolean sucess = false;
    
    public AutorDao(){
        this.conexao = new ConexaoPostgres();
        
    }
    
    public boolean cadastrarAutor(Autor autor) {
        sucess = false;

        try {
            System.out.println("cadastro Autor: " + autor.getRestanteNome() + " " + autor.getUltimoNome());
            ps = conexao.getConnection().prepareStatement("INSERT INTO AUTOR(ultimo_nome, restante_nome, lattes, id_instituicao) VALUES (?, ?, ?, ?) ");
            ps.setString(1, autor.getUltimoNome().toUpperCase());
            ps.setString(2, autor.getRestanteNome());
            ps.setString(3, autor.getLattes()); 
            ps.setInt(4, autor.getInstituicaoAutor().getId());
            ps.executeUpdate();
            conexao.closeConnection();

            sucess = true;
        } catch (SQLException ex) {
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
            conexao.closeConnection();
            return sucess;
        }

        conexao.closeConnection();
        return sucess;
    }
    
    public boolean alterarAutor (Autor autor) {
        sucess = false;


        try {
            
            ps = conexao.getConnection().prepareStatement("UPDATE autor SET ultimo_nome = ?, restante_nome = ?, lattes = ?, id_instituicao = ? where id = ?");

            ps.setString(1, autor.getUltimoNome().toUpperCase());
            ps.setString(2, autor.getRestanteNome());
            ps.setString(3, autor.getLattes());
            ps.setInt(4, autor.getInstituicaoAutor().getId());
            ps.setInt(5, autor.getId());
            ps.executeUpdate();
            conexao.closeConnection();
            
            sucess = true;
                    
        } catch (SQLException ex) {
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
            conexao.closeConnection();
            return sucess;
        }


        conexao.closeConnection();
        return sucess;
    }

    public boolean removerAutor(Autor autor) {
        sucess = false;
        try {

            ps = conexao.getConnection().prepareStatement(" DELETE FROM autor WHERE id = ?");

            ps.setLong(1, (autor.getId()));

            ps.executeUpdate();
            conexao.closeConnection();


            sucess = true;
        } catch (SQLException ex) {
            ex.printStackTrace();
            conexao.closeConnection();
            return sucess;
        }

        conexao.closeConnection();
        return sucess;
    }

    public List<Autor> listarAutores() {
        List<Autor> autores = new ArrayList<Autor>();
        try {
            ps = conexao.getConnection().prepareStatement("select a.id, restante_nome, ultimo_nome, lattes, id_instituicao, nome, estado, municipio from autor as a, instituicao as i where a.id_instituicao = i.id ORDER BY ultimo_nome");
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
           
                       
            while (rs.next()) {
                Autor autor = new Autor();

                autor.setUltimoNome(rs.getString("ultimo_nome"));
                autor.setRestanteNome(rs.getString("restante_nome"));
                autor.setLattes(rs.getString("lattes"));
                autor.setId(rs.getInt("id"));
                Instituicao inst = new Instituicao();
                inst.setEstado(rs.getString("estado"));
                inst.setId(rs.getInt("id_instituicao"));
                inst.setMunicipio(rs.getString("municipio"));
                inst.setNome(rs.getString("nome"));
                autor.setInstituicaoAutor(inst);
                
                
                autores.add(autor);


            }
        } catch (SQLException ex) {
            conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
        }



        conexao.closeConnection();
        return autores;

    }
    
    public List<Autor> listarAutoresSimplficado() {
        List<Autor> autores = new ArrayList<Autor>();
        try {
            ps = conexao.getConnection().prepareStatement("select id, restante_nome, ultimo_nome from autor ORDER BY ultimo_nome");
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
           
            
            
            while (rs.next()) {
                Autor autor = new Autor();

                autor.setUltimoNome(rs.getString("ultimo_nome"));
                autor.setRestanteNome(rs.getString("restante_nome"));
                autor.setId(rs.getInt("id"));
                
                
                
                autores.add(autor);


            }
        } catch (SQLException ex) {
            conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
        }
        return  autores;
    }
    
    public List<Autor> listarAutoresComObras() {
        List<Autor> autores = new ArrayList<Autor>();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT DISTINCT id, restante_nome, ultimo_nome FROM autor, obra_autor WHERE autor.id = obra_autor.id_autor ORDER BY ultimo_nome");
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
           
            
            
            while (rs.next()) {
                Autor autor = new Autor();

                autor.setUltimoNome(rs.getString("ultimo_nome"));
                autor.setRestanteNome(rs.getString("restante_nome"));
                autor.setId(rs.getInt("id"));
                
                
                
                autores.add(autor);


            }
        } catch (SQLException ex) {
            conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
        }
        return  autores;
    }
    
    public List<Autor> listarAutoresComVerbetes() {
        List<Autor> autores = new ArrayList<Autor>();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT DISTINCT id, restante_nome, ultimo_nome FROM autor, significado_autor WHERE autor.id = significado_autor.id_autor ORDER BY ultimo_nome");
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
           
            
            
            while (rs.next()) {
                Autor autor = new Autor();

                autor.setUltimoNome(rs.getString("ultimo_nome"));
                autor.setRestanteNome(rs.getString("restante_nome"));
                autor.setId(rs.getInt("id"));
                
                
                
                autores.add(autor);


            }
        } catch (SQLException ex) {
            conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
        }
        return  autores;
    }
    
    
    public boolean validarAutorJaCadastrado(Autor a) {
        System.out.println("Validados de Autor ja cadastrado executado!");
        PreparedStatement ps = null;
        
        try {
            ps = conexao.getConnection().prepareStatement("Select * from autor where ultimo_nome ~* ? and restante_nome ~* ?");
            System.out.println("Ultimo nome: " + a.getUltimoNome());
            System.out.println("Restante nome: "+ a.getRestanteNome());
            ps.setString(1, a.getUltimoNome());
            ps.setString(2, a.getRestanteNome());
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            if(rs.next()){
                System.out.println("Já cadastrado! Return false");
                conexao.closeConnection();
                return false;
            }
        } catch (SQLException ex) {
            Logger.getLogger(AutorDao.class.getName()).log(Level.SEVERE, null, ex);
            conexao.closeConnection();
        }
       
        conexao.closeConnection();
        System.out.println("Não encontrei: return true ");
        return true;
    }

    public Autor consultaAutor(int id) {
        PreparedStatement ps = null;
        Autor a = null;
        try {
            a = new Autor();
            ps = conexao.getConnection().prepareStatement("Select * from autor where id = ?; ");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            InstituicaoDao i = new InstituicaoDao();
            if (rs.next()) {

                a.setUltimoNome(rs.getString("ultimo_nome"));
                a.setRestanteNome(rs.getString("restante_nome"));
                a.setLattes(rs.getString("lattes"));
                a.setInstituicaoAutor(i.consultaInstituicao(rs.getInt("id_instituicao")));
                a.setId(id);


            }
        } catch (SQLException ex) {
            conexao.closeConnection();
            return a;

        }
        conexao.closeConnection();
        return a;
    }
    
}
